package de.projectgoodmorning.alarm.model.generic;

import java.io.Serializable;
import java.util.Calendar;

/**
 * Der Alarm stellt eine generisches Model fuer einen Alarm bereit.
 * Dieser speichert einen Status, sowie seinen Ausfuehrungszeitpunkt.
 * 
 * Die Aktion, welche zum Ausfuehrungszeitpunkt erfolgen soll, wird
 * durch einen Callback, durch den Programmierer bestimmt.
 */
public class Alarm implements Serializable {
	private static final long serialVersionUID = -9120320412280984236L;
	
	public static final int ACTIVE = 100;
	public static final int INACTIVE = 200;
	
	public int id;
	public int state;
	protected long timeInMillis;
	protected AlarmCallback callback;
	
	/**
	 * erstellt einen neuen Alarm.
	 * 
	 * @param timeInMillis	erwartet den Ausfuehrungszeitpunkt 
	 * 						( calendarObj.getTimeInMillis )
	 * 
	 * @param callback		erwartet eine Callback-Implementation, 
	 * 						welche ausgefuehrt werden soll
	 */
	public Alarm( long timeInMillis, AlarmCallback callback ) {
		this.timeInMillis = timeInMillis;
		this.callback = callback;
		this.state = INACTIVE;
	}

	/**
	 * @return		gibt den Ausfuehrungszeitpunkt als long zurueck
	 */
	public long getMoment() {
		return timeInMillis;
	}
	
	/**
	 * ermoeglicht das Einstellen eines anderen Ausfuehrungszeitpunktes
	 * @param calendar		erwartet ein Calendar-Objekt mit dem Zeitpunkt
	 */
	public void setMoment( Calendar calendar ) {
		this.timeInMillis = calendar.getTimeInMillis();
	}
	
	/**
	 * ermoeglicht das Einstellen eines anderen Ausfuehrungszeitpunktes
	 * @param timeInMillis	erwartet ein dem Zeitpunkt als long
	 */
	public void setMoment( long timeInMillis ) {
		this.timeInMillis = timeInMillis;
	}

	/**
	 * loest die hinterlegte Callback-Implementation aus. Sollte kein
	 * Callback vorliegen bzw. null sein, wird kein Callback ausgeloest.
	 * 
	 * @param obj	ein optionales Objekt als Parameter fuer den Callback
	 */
	public void execute( Object obj ) {
		if( callback != null ) {
			callback.callback( obj );
		}
	}
}
